//package com.coincalf.web;
//
//import com.coincalf.dto.RandCode;
//import com.coincalf.dto.RandCodeVerifyDTO;
//import com.coincalf.framework.exception.GlobalDefaultException;
//import com.coincalf.framework.http.Response;
//import com.coincalf.framework.utils.IpUtil;
//import com.coincalf.service.RandCodeService;
//import com.coincalf.web.vo.RandCodeForm;
//import com.coincalf.web.vo.mappers.RandCodeMapper;
//import io.swagger.annotations.Api;
//import io.swagger.annotations.ApiOperation;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.core.StringRedisTemplate;
//import org.springframework.validation.BindingResult;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestBody;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.validation.Valid;
//import java.util.concurrent.TimeUnit;
//
///**
// * @author qiang
// */
//@RestController
//@RequestMapping("/api/v1/dm")
//@Slf4j
//@Api(value = "发送验证码", description = "发送验证码 REST API")
//public class RandCodeController {
//
//    @Autowired
//    private RandCodeService randCodeService;
//    @Autowired
//    private HttpServletRequest request;
//    @Autowired
//    private StringRedisTemplate stringRedisTemplate;
//
//    /**
//     * 发送验证码
//     *
//     * @param form
//     * @return
//     */
//    @PostMapping("/sendTo")
//    @ApiOperation(value = "发送验证码", notes = "发送验证码", httpMethod = "POST")
//    Object sendTo(@RequestBody @Valid RandCodeForm form, BindingResult result) {
//        RandCode randCode = RandCodeMapper.INSTANCE.map(form);
//        String ip = IpUtil.getIpAddr(request);
//
//        String telKey = "RATE_LIMITER:tel:" + randCode.getTemplateCode() + ":" + randCode.getPhone();
//        String emailKey = "RATE_LIMITER:email:" + randCode.getTemplateCode() + ":" + randCode.getEmail();
//        String ipKey = "RATE_LIMITER:ip:" + randCode.getTemplateCode() + ":" + ip;
//
//        Long telResult = stringRedisTemplate.opsForValue().increment(telKey, 1);
//        if (telResult.equals(1L)) {
//            stringRedisTemplate.expire(telKey, 1, TimeUnit.MINUTES);
//        }
//        Long ipResult = stringRedisTemplate.opsForValue().increment(ipKey, 1);
//        if (ipResult.equals(1L)) {
//            stringRedisTemplate.expire(ipKey, 1, TimeUnit.DAYS);
//        }
//        if (telResult <= 3 && ipResult <= 100) {
//            randCodeService.sendTo(randCode);
//        } else {
//            // 短信发送次数超过上限
//            throw new GlobalDefaultException(41002);
//        }
//        return Response.ok();
//    }
//
//    /**
//     * 校验验证码
//     *
//     * @return
//     */
//    @PostMapping("/verify")
//    boolean verify(@RequestBody RandCodeVerifyDTO randCodeVerifyDTO) {
//        return randCodeService.verify(randCodeVerifyDTO);
//    }

//TODO 机器人刷单
//
//}
